package com.xframe.xdal.core.model;


import com.xframe.xdal.core.constant.SqlBuilderConstants;
import lombok.Data;

/**
 * 功能描述:默认的排序对象
 *
 * @author xufeng
 * @version 1.0
 * @date 2022-09-26
 */
@Data
public class DbSort implements IFieldToName, Comparable<DbSort> {

    /**
     * 被排序的字段名
     */
    private String sortColName;

    /**
     * 排序方向
     */
    private SortDir sortDir = SortDir.ASC;


    private Integer orderNo = 99;

//    /**
//     * 获得完整的排序表达式
//     */
//    public String getFullSortExp(){
//        return this.sortColName + " " + this.sortDir.toString();
//    }

    @Override
    public String getFieldName() {
        return sortColName;
    }

    /**
     * 是否一个属性路径
     */
    public boolean isAttrPath(){
        return getSortColName().indexOf(SqlBuilderConstants.SP) > 0;
    }

    /**
     * 构造函数
     * @param sortColName 排序字段
     */
    public DbSort(String sortColName){
        this.sortColName = sortColName;
        this.sortDir = SortDir.ASC;
    }

    /**
     * 构造函数
     * @param sortColName 排序字段
     * @param sortDir 排序方向
     */
    public DbSort(String sortColName,SortDir sortDir){
        this.sortColName = sortColName;
        this.sortDir = sortDir;
    }

    /**
     * 构造函数
     * @param sortColName 排序字段
     * @param sortDir 排序方向
     */
    public DbSort(String sortColName,SortDir sortDir,Integer orderNo){
        this.sortColName = sortColName;
        this.sortDir = sortDir;
        this.orderNo = orderNo;
    }

    @Override
    public boolean equals(Object anObject) {
        if (anObject instanceof DbSort){
            DbSort dbSort = (DbSort)anObject;
            return this.sortColName.equals(dbSort.sortColName);
        }else {
            return false;
        }
    }

    @Override
    public int hashCode(){
        return this.sortColName.hashCode();
    }

    @Override
    public int compareTo(DbSort dbSort) {
        return this.orderNo - dbSort.orderNo;
    }

    /**
     * 排序枚举类型
     */
    public enum SortDir{
        /**
         * 升序
         */
        ASC,
        /**
         * 降序
         */
        DESC
    }

}
